package com.example.deepai.service;

import com.example.deepai.model.TestCase;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Collections;

@Slf4j
@Service
@RequiredArgsConstructor
public class TestCaseGenerationService {
    private final DeepSeekService deepSeekService;

    public TestCase generateTestCase(String uiStructure, String name, String description) throws IOException {
        String prompt = String.format("""
            基于以下UI结构生成全面的中文测试用例：
            %s
            
            测试用例要求：
            1. 名称：%s
            2. 描述：%s
            3. 使用以下格式：
               场景：[场景名称]（标明正向/异常）
               前置条件：
               操作步骤：
                 1. [具体操作步骤]
                 2. [具体操作步骤]
                 ...
               预期结果：
                 1. [功能层面的预期结果]
                 2. [用户体验层面的预期结果]
                 ...
            4. 测试场景设计原则：
               - 将每个独立功能点作为单独的测试场景
               - 正向场景应覆盖所有核心功能点
               - 异常场景应考虑各种错误操作和边界条件
               - 考虑不同操作顺序的组合（如播放-录制-切换视频）
               - 考虑功能间的交互和影响
               - 不限制测试场景数量，尽可能全面覆盖
            
            5. 场景类型（至少包含以下类型）：
               - 基础功能验证：每个核心功能单独验证
               - 功能组合验证：多个功能组合使用
               - 操作顺序验证：不同的操作顺序
               - 异常操作验证：错误的操作顺序或无效操作
               - 边界条件验证：极限值或特殊情况
               - 用户体验验证：操作流程和反馈
            
            6. 注意事项：
               - 场景描述要突出测试目的
               - 操作步骤要具体且可执行
               - 预期结果要关注功能实现效果
               - 验证重点是功能是否正常工作
               - 尽可能多角度设计测试场景，不限数量
            """, uiStructure, name, description);

        String content = deepSeekService.getCompletion(prompt, Collections.emptyList());

        TestCase testCase = new TestCase();
        testCase.setName(name);
        testCase.setDescription(description);
        testCase.setContent(content);
        testCase.setUiStructure(uiStructure);
        testCase.setCreatedAt(LocalDateTime.now());

        return testCase;
    }
}